/**
 * 
 */
package br.com.sgc.session;

import java.util.ArrayList;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Stateless;

import br.com.sgc.entities.cep.Bairro;
import br.com.sgc.entities.cep.Cidade;
import br.com.sgc.entities.cep.Logradouro;
import br.com.sgc.entities.cep.UF;
import br.com.sgc.entities.geral.Endereco;
import br.com.sgc.entities.geral.Pessoa;
import br.com.sgc.exception.ValidacaoException;

@Stateless
public class EnderecoSession extends GenericSession<Endereco> {
		
	private static final long serialVersionUID = 1L;
	
	@EJB
	private GenericSession<Logradouro> logradouroSession;
	
	@EJB
	private GenericSession<Bairro> bairroSession;
	
	@EJB
	private CidadeSession cidadeSession;
	
	@EJB
	private GenericSession<UF> ufSession;
	
	public List<Endereco> getEnderecosPersistent(List<Endereco> listEndereco) {
		List<Endereco> enderecos = new ArrayList<Endereco>();
		for(Endereco end: listEndereco){
			end = super.findById(Endereco.class, end.getId(), true);
			end.setCidade(cidadeSession.findById(Cidade.class, end.getCidade().getId()));
			end.setUf(ufSession.findById(UF.class, end.getUf().getId()));
			enderecos.add(end);
		}
		return enderecos;
	}
	
	public List<Endereco> prepareDependecies(List<Endereco> enderecos, Pessoa pessoa) throws ValidacaoException{
		validar(enderecos);
		List<Endereco> listEndereco = new ArrayList<Endereco>();
		for(Endereco endereco: enderecos){
			endereco.setPessoa(pessoa);
			listEndereco.add(endereco);
		}
		return listEndereco;
		
	}

	public Endereco findEnderecoByCep(String cep) throws ValidacaoException {
		Endereco endereco = new Endereco();
		Logradouro logradouro = new Logradouro();
		logradouro.setCep(cep);
		if(!cep.trim().equals("")){
			List<Logradouro> list = logradouroSession.example(logradouro, true);
			if(!list.isEmpty()){
				logradouro = list.get(0);
				logradouro = logradouroSession.findById(Logradouro.class, logradouro.getId(), true);
				Bairro bairro = bairroSession.findById(Bairro.class, logradouro.getBairro().getId(), true);
				Cidade cidade = cidadeSession.findById(Cidade.class, bairro.getCidade().getId(), true);
				UF uf = ufSession.findById(UF.class, cidade.getUf().getId(), true);
				
				cidade.setUf(uf);
				bairro.setCidade(cidade);
				logradouro.setBairro(bairro);
				
				endereco.setLogradouro(logradouro.getLogradouro());
				endereco.setCidade(cidadeSession.findById(Cidade.class ,cidade.getId(),true));
				endereco.setBairro(bairro.getDescricao());
				endereco.setUf(endereco.getCidade().getUf());
				endereco.setCep(cep);
			} else {
				Bairro bairro = new Bairro();
				Cidade cidade = new Cidade();
				UF uf = new UF();
				
				cidade.setUf(uf);
				bairro.setCidade(cidade);
				logradouro.setBairro(bairro);
				
				endereco.setLogradouro(logradouro.getLogradouro());
				endereco.setCidade(cidade);
				endereco.setBairro(bairro.getDescricao());
				endereco.setUf(endereco.getCidade().getUf());
				endereco.setCep(cep);
				
				throw new ValidacaoException("Não foi encontrado nenhum endereço para o CEP informado. Tente localizar novamente ou cadastre um novo endereço preenchendo os campos abaixo.");
			}
		} else {
			throw new ValidacaoException("Informe um CEP válido.");
		}
		return endereco;
	}
	
	
	public void validarAddEndereco(Endereco endereco, boolean isCadastroNovoEndereco) throws ValidacaoException  {
		if(!endereco.getCep().isEmpty()) {
			if(isCadastroNovoEndereco) {
				Logradouro logradouro = new Logradouro();
				logradouro.setCep(endereco.getCep());
				List<Logradouro> list = logradouroSession.example(logradouro, true);
			
				if(list != null && list.size() > 0) {
					throw new ValidacaoException("CEP já cadastrado. Localize o endereço informando o CEP e clicando no botão Localizar.");
				}
			}
			
			if(!enderecoValido(endereco)) {
				throw new ValidacaoException("Endereço inválido. Informe o CEP e clique no botão Localizar. Em seguida informe os campos necessário.");
			}
		} else {
			throw new ValidacaoException("CEP é requerido.");
		}
	}
	
	private boolean enderecoValido(Endereco endereco) {
		return endereco != null
			&& !endereco.getLogradouro().isEmpty() 
			&& !endereco.getBairro().isEmpty()
			&& !endereco.getCep().isEmpty()
			&& endereco.getUf() != null && endereco.getUf().getId() != null
			&& endereco.getCidade() != null && endereco.getCidade().getId() != null;
	}
	
	public void validar(List<Endereco> t) throws ValidacaoException {
		if(t == null || t.isEmpty()){
			throw new ValidacaoException("É necessário informar pelo menos um endereço");
		}
	}
	
	public void validar(Endereco t) throws ValidacaoException {
		String erro = "";
		
		if(t.getCep() == null || t.getCep().isEmpty()){
			erro += "Campo CEP � necess�rio. <br />";
		}
		
		if(t.getLogradouro() == null || t.getLogradouro().trim().equals("")){
			erro += "Campo Logradouro � necess�rio. <br />";
		} 
		
		if (t.getNumero() == null || t.getNumero().trim().equals("")) {
			erro += "Campo N�mero � necess�rio. <br />";
		}
		
		if(t.getBairro() == null || t.getBairro().isEmpty()){
			erro += "Campo Bairro � necess�rio. <br />";
		}
		
		if(t.getUf() == null || t.getUf().getId() == null){
			erro += "Campo Estado � necess�rio. <br />";
		}
		
		if(t.getCidade() == null || t.getCidade().getId() == null){
			erro += "Campo Cidade � necess�rio. <br />";
		}
		
		if(!erro.isEmpty()){
			throw new ValidacaoException(erro);
		}
	}
	
}
